package com.woniuxy.carlife.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.woniuxy.carlife.domain.ServiceAppraiseTag;
import com.woniuxy.carlife.dto.AppraiseTagDto;
import com.woniuxy.carlife.mapper.ServiceAppraiseTagMapper;
import com.woniuxy.carlife.param.SaveAppraiseTagParam;
import com.woniuxy.carlife.service.ServiceAppraiseTagService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author fx
 * @ClassName:ServiceAppraiseTagServiceImpl
 * @Description: 门店服务评价标签service实现类
 * @date 2021/4/6 20:00
 **/

@Service
public class ServiceAppraiseTagServiceImpl extends ServiceImpl<ServiceAppraiseTagMapper, ServiceAppraiseTag> implements ServiceAppraiseTagService {

    @Resource
    private ServiceAppraiseTagMapper appraiseTagMapper;

    @Resource
    private RedisTemplate redisTemplate;

    /**
     * 功能描述〈根据门店id增加门店评论标签信息〉
     * @author:fx
     * @param: @param null:
     * @return:
     * @Date 2021/4/10 10:16
     * @throws
     */
    @Override
    public Integer saveCommentTagStatusByStoreId(SaveAppraiseTagParam appraiseTag) {
        //先根据内容和门店id和标签使用中的状态查一次是否存在
        QueryWrapper<ServiceAppraiseTag> queryWrapper = new QueryWrapper<>();
        //门店id条件
        queryWrapper.eq("store_id",appraiseTag.getStoreId());
        //标签内容条件
        queryWrapper.eq("comment_tag_content",appraiseTag.getCommentTagContent());
        //标签状态
        queryWrapper.eq("comment_tag_status",1);
        ServiceAppraiseTag tag1 = appraiseTagMapper.selectOne(queryWrapper);
        //判断是否获取到数据
        if (ObjectUtils.isEmpty(tag1)){
            //没有数据就进行新增
            ServiceAppraiseTag tag = new ServiceAppraiseTag();
            // 门店id
            tag.setStoreId(appraiseTag.getStoreId());
            //标签内容
            tag.setCommentTagContent(appraiseTag.getCommentTagContent());
            //评论标签被选择数量,初始值为0
            tag.setCommentTagNum(0);
            //评论标签的状态，默认为1
            tag.setCommentTagStatus(1);
            //创建时间
            tag.setCommentTagCreateTime(new Timestamp(new Date().getTime()));
            //存储数据到数据库
            int insert = appraiseTagMapper.insert(tag);
            if (insert>0){
                return 1;
            }
            return 0;
        }
        //返回1代表新增成功，-1代表新增失败,0代表已有数据
        return -1;
    }

    /**
     * 功能描述〈根据门店id查看指定门店所有的评论标签内容和被选择的数量〉
     * @author:fx
     * @param: @param null:
     * @return:
     * @Date 2021/4/10 10:22
     * @throws
     */
    @Override
    public List<AppraiseTagDto> findAllApprasieTagByStoreId(Integer storeId) {
        //根据门店id查询所有的评论标签内容和被选择的数量
        List<AppraiseTagDto> appraiseTagDto =
                appraiseTagMapper.findContenAndNumByStoreId(storeId);
        //判断是否有数据
        if (ObjectUtils.isEmpty(appraiseTagDto)){
            return null;
        }
        //有数据就返回这个dto
        return appraiseTagDto;
    }

    /**
     * 功能描述〈根据评论标签id改变评论标签被选择的次数〉
     * @author:fx
     * @param: @param null:
     * @Date 2021/4/10 10:31
     * @throws
     * @return
     */
    @Override
    public boolean updateAppraiseTagByTagId(List<Integer> appraiseTagId) {
        //调用这个方法表示标签一定被选择，使用这个方法前先进性判断是否传了id
        //循环参数集合
        //声明一个集合存放需要从数据库中查询信息的标签id
        ArrayList<Integer> tagId = new ArrayList<>();
        //声明一个boolean类型判断，防止传入的所有值类型正确但都不是数据库中真实存在的数据
        Boolean b=false;
        for (int i = 0; i < appraiseTagId.size(); i++) {
            if (appraiseTagId.get(i)==null){
                continue;
            }
            //先从redis中查询,查询出来是字符串
            String tagNum =(String) redisTemplate.opsForValue()
                    .get("com.woniuxy:carlife:serviceproject:serviceapprisetag:num:id" + appraiseTagId.get(i));
            //先判断Redis中是否有这个id对应的信息
            if (ObjectUtils.isEmpty(tagNum)){
                //如果没有就放到需要到数据库查询的id集合中
                tagId.add(appraiseTagId.get(i));
                continue;
            }else{
                //如果能从reids中查询到数据,先把字符串转换成Integer类型
                int num = Integer.parseInt(tagNum);
                //把数量加1
                num++;
                //再存到redis中,存的时候要把数量转换成字符串类型
                redisTemplate.opsForValue()
                        .set("com.woniuxy:carlife:serviceproject:serviceapprisetag:num:id" + appraiseTagId.get(i),num+"");
                //能查到数据就把变量说明这个至少与一个值正确，把b变成true
                b=true;
            }
        }
        //再判断需要到数据库查询的集合是否为空
        if (!ObjectUtils.isEmpty(tagId)){
            //不为空解就要到数据库中查询
            //循环遍历这些id集合
            for (int i = 0; i < tagId.size(); i++) {
                //从数据库中根据标签查询
                ServiceAppraiseTag tag = appraiseTagMapper.selectById(tagId.get(i));
                //判断这个id是否能从数据库中查找到值
                if (ObjectUtils.isEmpty(tag)){
                    //查不到就继续循环
                    continue;
                }else{
                    //能查找到值才执行这些操作
                    //把数量加一
                    tag.setCommentTagNum(tag.getCommentTagNum()+1);
                    //再存到redis中
                    redisTemplate.opsForValue()
                            .set("com.woniuxy:carlife:serviceproject:serviceapprisetag:num:id" + tagId.get(i),
                                    tag.getCommentTagNum()+"");
                    b=true;
                }
            }
        }
        return b;
    }

    /**
     * 功能描述〈根据评论标签id改变标签状态为未使用，每次改变一个〉
     * @author:fx
     * @param: @param null:
     * @return:
     * @Date 2021/4/10 10:34
     * @throws
     */
    @Override
    public boolean updateAppraiseTagStatusByTagId(Integer appraiseTagId) {
        //先判断是否能根据这个id从数据库中查到数据
//        ServiceAppraiseTag tag1 = appraiseTagMapper.selectOne(new QueryWrapper<ServiceAppraiseTag>()
//                .eq("comment_tag_id", appraiseTagId));
//        if (ObjectUtils.isEmpty(tag1)){
//            return false;
//        }
        //直接调用修改方法修改
        ServiceAppraiseTag tag = new ServiceAppraiseTag();
        tag.setCommentTagId(appraiseTagId);
        tag.setCommentTagStatus(0);
        int i = appraiseTagMapper.updateById(tag);
        if (i>0){
            return true;
        }
        return false;
    }

    /**
     * 功能描述〈根据门店id查询指定门店评论标签状态为已使用的标签〉
     * @author:fx
     * @param: @param null:
     * @return:
     * @Date 2021/4/10 10:37
     * @throws
     */
    @Override
    public List<AppraiseTagDto> findAllAppraiseTagByStoreIdWithStatusIsING(Integer storeId) {
        //调用mapper的方法
        List<AppraiseTagDto> tagDtos = appraiseTagMapper.findContenAndNumByStoreIdAndStatus(storeId);
        //判断是否获取到值
        if (ObjectUtils.isEmpty(tagDtos)){
            //如果没有值就返回空
            return null;
        }
        //返回dto对象
        return tagDtos;
    }
}
